package com.hsc.mvc.handler;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;

/**
 * @author
 * @date 2025-06-10
 * @Description 直接返回字符串，转发 (对页面或者jsp进行转发)
 */
public class ForwardHandler implements ResponseHandleStrategy {

    /**
     * 进行转发操作
     *
     * @param result
     * @param targetMethod
     * @return
     */
    @Override
    public boolean isSupport(Object result, Method targetMethod) {
        // 这里我直接通过判断返回值的类型是不是字符串类型
        // 正常情况我们需要判断的条件是 : 1、该方法没有注解 @ResponseBody 2、返回值类型是字符串 3、返回的字符串类型中不包含 redirect （因为重定向使用redirect 进行标识额度，但是整体上也是属于字符串）
        // 正常要满足以下条件才算满足是进行重定向
        // result instanceof String && (String) result.startsWith("redirect:") && targetMethod.getAnnotation(ResponseBody.class)
        // 但是我们这里直接判断 是否 result instanceof String 就可以呢？
        // 因为我们对在集合中对响应策略的处理器做了排序 ，将StringResultHandler 放到最后 ，前面那些返回字符串并且 包含 ResponseBody 注解的方法和redirect 字符的串 的已经在前面进行了处理
        // 代码能走到这里 并且还是字符串的 说明是满足这里的条件的
        return result instanceof String;
    }

    @Override
    public void handle(Object result, Method targetMethod, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 直接进行转发
        request.getRequestDispatcher((String) result).forward(request, response);
    }
}
